package com.dream.controller;

import com.dream.bean.Cart;
import com.dream.bean.User;
import com.dream.service.UserService;
import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import static com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY;

/**
 * @author 匠人码农
 * @date 2020/12/05 17:21
 * 概要：
 *     用户模块控制器
 */
@Controller
public class UserController {

    /**
     * 购物车页面
     */
    private static final String CART = "cart/cart";

    /**
     * 登录成功页面
     */
    private static final String LOGIN_SUCCESS = "user/login_success";

    /**
     * 登录页面
     */
    private static final String LOGIN = "user/login";

    /**
     * 重定向到首页
     */
    private static final String INDEX ="redirect:/client/page";

    /**
     * 注册页面
     */
    private static final String REGIST = "user/regist";

    /**
     * 注册成功页面
     */
    private static final String REGIST_SUCCESS = "user/regist_success";

    @Autowired
    UserService userService;

    /**
     * 登录
     * @param user 用户
     * @param req  请求
     * @param model model
     * @return   跳转页面
     */
    @RequestMapping("/login")
    public String login(User user, HttpServletRequest req,Model model){

        //调用service
        User dbUser = userService.login(user);

        //用户和密码正确
        if(null != dbUser){

            //user信息
            //登录成功的信息存放到session
            req.getSession().setAttribute("user",dbUser);

            Cart cart = (Cart) req.getSession().getAttribute("cart");

            //购物车不为空
            if( cart != null){
                //跳转到购物车页面
                return CART;
            }else {
                //跳转到登录成功页面
                return LOGIN_SUCCESS;

            }
        }else{
            //使用SpringMVC的Model
            model.addAttribute("msg","用户名或者密码错误！");
            model.addAttribute("username",user.getUsername());

            //跳转到登录页面
            return LOGIN;
        }
    }

    /**
     * 注销
     * @param req  请求
     * @return     首页
     */
    @RequestMapping(value = "/logout",method = RequestMethod.GET)
    public String logout(HttpServletRequest req){
        //销毁session
        req.getSession().invalidate();

        //跳转到登录页面
        return INDEX;
    }

    /**
     * 注册
     * @param user   用户
     * @param req    请求
     * @param model  model
     * @return       跳转页面
     */
    @RequestMapping("/regist")
    public String regist(User user,HttpServletRequest req,Model model){

        //1.获取session中谷歌生成的验证码
        String googleCode = (String) req.getSession().getAttribute(KAPTCHA_SESSION_KEY);

        //2.删除session中的验证码(防止表单重复提交)
        req.getSession().removeAttribute(KAPTCHA_SESSION_KEY);

        //3.获取输出的验证码
        String code = req.getParameter("code");

        //4.检验验证码
        if(googleCode != null && !googleCode.equalsIgnoreCase(code)){
            //错误信息以及要回显的信息
            //错误信息
            model.addAttribute("msg","验证码错误！");
            //回显用户名
            model.addAttribute("username",user.getUsername());
            //回显邮件地址
            model.addAttribute("email",user.getEmail());

            //跳转回注册界面
            return REGIST;
        } else {

            //bean设定
            user.setRegistTime(new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new Date()));

            //检查用户名是否存在
            //已经存在
            if(userService.existsUserName(user.getUsername())){
                //错误信息以及要回显的信息
                //错误信息
                model.addAttribute("msg","用户名已存在！");
                //回显用户名
                model.addAttribute("username",user.getUsername());
                //回显邮件地址
                model.addAttribute("email",user.getEmail());

                //跳转回注册页面
                return REGIST;

                //不存在
            } else {
                //跳转到成功页面
                userService.registUser(user);

                //把注册成功的用户信息存放到session中
                req.getSession().setAttribute("user",user);

                //请求转发到注册成功页面
                return REGIST_SUCCESS;
            }
        }

    }

    /**
     * 验证用户名是否存在
     * @param req 请求信息
     * @param resp 响应信息
     * @throws IOException  IO异常
     */
    @RequestMapping("/ajaxExistsUserName")
    public void ajaxExistsUserName(HttpServletRequest req, HttpServletResponse resp) throws IOException {

        //获取用户名
        String userName = req.getParameter("userName");

        //调用服务层
        boolean existsUserName = userService.existsUserName(userName);

        //创建存储结果的Map
        Map<String,Object> resultMap = new HashMap<>();

        //存放结果
        resultMap.put("existsUserName",existsUserName);

        //JSon转换
        Gson gson = new Gson();

        //转换成字符串
        String json = gson.toJson(resultMap);

        //输出字符串
        resp.getWriter().write(json);

    }
}
